global var_listeSalons
global var_salonCourantId
set var_nbDemandesMax 20

################################################################################
# Procedure d'ajout d'un salon
################################################################################
proc proc_ajoutSalon { param_salonId param_salonNom param_noeudId param_distance param_idPing param_estampille param_idCentreSuppleant param_poidsCentre param_poidsCentreSuppleant param_monPoids param_cycleAvantEnvoiPing} {
	global var_listeSalons

	set var_listeSalons($param_salonId) $param_salonId
	set var_listeSalons($param_salonId,nom) $param_salonNom
	set var_listeSalons($param_salonId,connecte) 0
	set var_listeSalons($param_salonId,listeConnecte) {}
	set var_listeSalons($param_salonId,idCentre) $param_noeudId
	set var_listeSalons($param_salonId,dernierContact) [clock clicks -milliseconds]
	set var_listeSalons($param_salonId,distance) $param_distance
	set var_listeSalons($param_salonId,idPing) $param_idPing
	set var_listeSalons($param_salonId,estampille) $param_estampille
	set var_listeSalons($param_salonId,listeMessagesManquants) {}
	set var_listeSalons($param_salonId,idCentreSuppleant) $param_idCentreSuppleant
	set var_listeSalons($param_salonId,poidsCentre) $param_poidsCentre
	set var_listeSalons($param_salonId,poidsCentreSuppleant) $param_poidsCentreSuppleant
	set var_listeSalons($param_salonId,monPoids) $param_monPoids
	set var_listeSalons($param_salonId,nombreDeCycleAvantEnvoi) $param_cycleAvantEnvoiPing
	
	# ajoute l'horloge correspondante
	proc_addSalonHorloge $param_salonId
}

################################################################################
# Procedure d'ajout d'un message manquant
################################################################################
proc proc_ajoutSalonMessageManquant { param_salonId param_noeudId param_numAction } {
	global var_listeSalons
	global var_nbDemandesMax
	
	set var_triplet [list $param_noeudId $param_numAction $var_nbDemandesMax]
	
	# Verifie si il a pas deja demande
	if { [lsearch $var_listeSalons($param_salonId,listeMessagesManquants) [list $param_noeudId $param_numAction *]] == -1 } {
		lappend var_listeSalons($param_salonId,listeMessagesManquants)  $var_triplet
	}
}

################################################################################
# Procedure de suppression d'un message manquant dans la liste des messages
# a demander
################################################################################
proc proc_suppSalonMessageManquant { param_salonId param_noeudId param_numAction } {
	global var_listeSalons
	
	set var_triplet [list $param_noeudId $param_numAction *]
	
	set var_indiceCoupleASupp [lsearch $var_listeSalons($param_salonId,listeMessagesManquants) $var_triplet]
	# Verifie si il a pas deja demande
	if { $var_indiceCoupleASupp != -1 } {
		set var_listeSalons($param_salonId,listeMessagesManquants) [lreplace $var_listeSalons($param_salonId,listeMessagesManquants) $var_indiceCoupleASupp $var_indiceCoupleASupp]
	}
	
	return $var_indiceCoupleASupp
}

################################################################################
# Procedure de demande de messages manquants
################################################################################
proc proc_salonDemandeMessageManquant { param_salonId } {
	global var_listeSalons
	
	
	# Pour chaque message manquant, sous forme de couple (noeudId,numAction)
	foreach var_triplet $var_listeSalons($param_salonId,listeMessagesManquants) {
		set var_noeudId [lindex $var_triplet 0]
		set var_numAction [lindex $var_triplet 1]
		set var_demandesRestantes [lindex $var_triplet 2]
		
		# Si on a depasse le nombre maximal de demande, on supprime le message
		if { $var_demandesRestantes == 0 } {
			proc_suppSalonMessageManquant $param_salonId $var_noeudId $var_numAction
		} else {
			# On retire une demande du compteur
			set ind [lsearch $var_listeSalons($param_salonId,listeMessagesManquants) $var_triplet]
			set var_listeSalons($param_salonId,listeMessagesManquants) [lreplace $var_listeSalons($param_salonId,listeMessagesManquants) $ind $ind [list $var_noeudId $var_numAction [expr $var_demandesRestantes - 1]]]

			# On l'ajoute a la liste des messages que l'on va demander
			lappend var_messages($var_noeudId) $var_numAction
		}
		
		
	}
	
	set var_listeMessages ""
	
	# Pour chaque noeud pour lequel il nous manque des messages
	foreach var_noeudIdManquant [array names var_messages] {
		if { $var_listeMessages != "" } {
			set var_listeMessages ":$var_listeMessages"
		}
		# Concatene tous les numeros d'actions des messages manquants pour ce noeud
		set var_listeMessagesNoeud [join $var_messages($var_noeudIdManquant) ","]
		# Ajoute le couple (noeudId;listeMessagesManquants) au message qui sera envoye
		set var_listeMessages "$var_noeudIdManquant;$var_listeMessagesNoeud$var_listeMessages"
		
		# Incremente le compteur de redemande
		#set var_historique($param_salonId,$param_noeudId,$param_numAction,nbDemandesRestantes) $var_nbDemandesMax
	}
	
	return $var_listeMessages
}



################################################################################
# Procedure appelee a la suppression d'un salon avec son id
################################################################################
proc proc_supprimerSalon { param_salonId } {
	global var_listeSalons

	# si on estait connecte, on se deconnecte
	if { [proc_getConnexionSalon $param_salonId] == 1 } {
		proc_deconnexionSalon $param_salonId
	}
	
	# Vide toutes les information associees
	array unset var_listeSalons "$param_salonId*"
	
	# supprime l'horloge correspondante
	proc_supSalonHorloge $param_salonId
	
	# Supprime l'historique des messages de ce salon
	proc_histoDelSalon $param_salonId

	# Rafraichi l'affichage
	proc_updateListeSalons
	proc_afficheListeNoeudsConnecteSalon $param_salonId
}


################################################################################
# Verifie si un salon donne existe dans notre liste des salons
################################################################################
proc proc_salonExiste { param_salonId } {
	global var_listeSalons
	if { [info exists var_listeSalons($param_salonId)] } {
		return 1
	} else {
		return 0
	}
}

################################################################################
# Retourne la liste des salons connus
################################################################################
proc proc_getListeSalons { } {
	global var_listeSalons
	
	return $var_listeSalons
}


################################################################################
# Retourne la liste des ids des salons connus
################################################################################
proc proc_getListeIdsSalons { } {
	global var_listeSalons
	
	set var_listeRetour {}
	
	foreach var_idSalon [array names var_listeSalons -regexp {^[^,]*$}]  {
		lappend var_listeRetour $var_idSalon
	}
	
	return $var_listeRetour
}


################################################################################
# Retourne le nom d'un salon dont on connait l'id
################################################################################
proc proc_getSalonNom { param_salonId } {
	global var_listeSalons
	
	return $var_listeSalons($param_salonId,nom) 
}

################################################################################
# Retourne l'estampille d'un salon dont on connait l'id
################################################################################
proc proc_getSalonEstampille { param_salonId } {
	global var_listeSalons
	
	return $var_listeSalons($param_salonId,estampille) 
}

################################################################################
# Met a jour l'estampille d'un salon dont on connait l'id si besoin
################################################################################
proc proc_updateSalonEstampille { param_salonId param_estampille } {
	global var_listeSalons
	if { $param_estampille > $var_listeSalons($param_salonId,estampille) } {
		set var_listeSalons($param_salonId,estampille) $param_estampille
	}
}

################################################################################
# Incremente l'estampille
################################################################################
proc proc_incrEstampille { param_salonId} {
	global var_listeSalons
	
	set var_listeSalons($param_salonId,estampille)  [expr $var_listeSalons($param_salonId,estampille) + 1]
}

################################################################################
# Retourne le ping d'un salon dont on connait l'id
################################################################################
proc proc_getSalonPing { param_salonId } {
	global var_listeSalons
	
	if { [info exists var_listeSalons($param_salonId) ] == 1  && [info exists var_listeSalons($param_salonId,idPing) ] == 1 } {
		return $var_listeSalons($param_salonId,idPing) 
	} else {
		return -1
	}
}

################################################################################
# incremente le ping d'un salon dont on connait l'id
################################################################################
proc proc_incrSalonPing { param_salonId } {
	global var_listeSalons
	
	if { [info exists var_listeSalons($param_salonId) ] == 1  && [info exists var_listeSalons($param_salonId,idPing) ] == 1 } {
		set var_listeSalons($param_salonId,idPing) [expr $var_listeSalons($param_salonId,idPing)  + 1]
	} 
}

################################################################################
# change le ping d'un salon dont on connait l'id
################################################################################
proc proc_setSalonPing { param_salonId param_pingId} {
	global var_listeSalons
	
	if { [info exists var_listeSalons($param_salonId) ] == 1 } {
		set var_listeSalons($param_salonId,idPing) $param_pingId
	} 
}

################################################################################
# Retourne la liste des ids des noeuds connectes a un salon
################################################################################
proc proc_getSalonConnectes { param_salonId } {
	global var_listeSalons
		
	if { [info exists var_listeSalons($param_salonId,listeConnecte)] == 0 } {
		return {}
	}
	
	# Pour ne recupere que le champ qui nous interesse dans la structure
	set motif "\^$param_salonId,listeConnecte,\[\^,\]*\$"
	
	set var_listeConnecte {}
	
	foreach var_idNoeuds [array names var_listeSalons -regexp $motif]  {
		lappend var_listeConnecte $var_listeSalons($var_idNoeuds)
	}
	
	return $var_listeConnecte
}

################################################################################
# Ajoute un noeud a la liste des connectes a un salon donne
################################################################################
proc proc_ajouterNoeudListeConnectesSalon { param_salonId param_noeudId } {
	global var_listeSalons
	
	set var_listeSalons($param_salonId,listeConnecte,$param_noeudId) $param_noeudId
	set var_listeSalons($param_salonId,listeConnecte,$param_noeudId,dernierContact) [clock clicks -milliseconds]
	
	proc_afficheListeNoeudsConnecteSalon $param_salonId	
}


################################################################################
# Verifie si on est connecte a un salon donne
################################################################################
proc proc_getConnexionSalon { param_salonId } {
	global var_listeSalons
	if { [info exists var_listeSalons($param_salonId,connecte)] == 0 } {
		return 0
	} else {
		return $var_listeSalons($param_salonId,connecte)
	}
}

################################################################################
# Retourne l'id du centre du salon
################################################################################
proc proc_getIdCentre { param_salonId } {
	global var_listeSalons
	if { [info exists var_listeSalons($param_salonId,idCentre)] == 0 } {
		return ""
	} else {
		return $var_listeSalons($param_salonId,idCentre)
	}
}

################################################################################
# Retourne la distance au centre d'un salon donne
################################################################################
proc proc_getDistanceSalon { param_salonId } {
	global var_listeSalons
	if { [info exists var_listeSalons($param_salonId,distance)] == 0 } {
		return 0
	} else {
		return $var_listeSalons($param_salonId,distance)
	}
}

################################################################################
# Retourne la date de dernier contact au centre d'un salon donne
################################################################################
proc proc_getDernierContactSalon { param_salonId } {
	global var_listeSalons
	if { [info exists var_listeSalons($param_salonId,dernierContact)] == 0 } {
		return 0
	} else {
		return $var_listeSalons($param_salonId,dernierContact)
	}
}

################################################################################
# Modifie l'etat de connexion a un salon
################################################################################
proc proc_setConnexionSalon { param_salonId param_connexion } {
	global var_listeSalons
	set var_listeSalons($param_salonId,connecte) $param_connexion
}

################################################################################
# Modifie la date de dernier contact au centre d'un salon
################################################################################
proc proc_setDernierContactSalon { param_salonId param_dernierContact } {
	global var_listeSalons
	set var_listeSalons($param_salonId,dernierContact) $param_dernierContact
}

################################################################################
# Modifie la distance au centre d'un salon
################################################################################
proc proc_setDistanceSalon { param_salonId param_distance } {
	global var_listeSalons
	set var_listeSalons($param_salonId,distance) $param_distance
}

################################################################################
# Recupere l'id du salon par son numero dans la liste d'affichage
################################################################################
proc proc_getSalonIdNumeroListe { param_num } {
	global var_listeSalons
	return [lindex [array names var_listeSalons -regexp {^[^,]*$}]  $param_num]
}

################################################################################
# Retourne l'id du salon dans lequel on est actuellement
################################################################################
proc proc_getSalonCourantId { } {
	global var_salonCourantId
	return $var_salonCourantId
}

################################################################################
# Modifie l'id du salon dans lequel on est actuellement
################################################################################
proc proc_setSalonCourantId { param_salonId } {
	global var_salonCourantId
	set var_salonCourantId $param_salonId
}

################################################################################
# 
###############################################################################
proc proc_supprimerConnecteSalon  { param_salonId param_noeudId } {
	global var_listeSalons
	
	unset var_listeSalons($param_salonId,listeConnecte,$param_noeudId) 
	set var_listeSalons($param_salonId,listeConnecte,$param_noeudId,dernierContact)
}

################################################################################
# 
################################################################################
proc proc_getDernierContactConnecteSalon { param_salonId param_noeudId } {
	global var_listeSalons
	
	if { [info exists var_listeSalons($param_salonId,listeConnecte,$param_noeudId,dernierContact)] == 0 } {
		return 0
	} else {
		return $var_listeSalons($param_salonId,listeConnecte,$param_noeudId,dernierContact)
	}
	
}

################################################################################
# Recupere la liste des ids des salons auquels on est connecte
################################################################################
proc proc_getListeIdsSalonsConnectes { } {
	global var_listeSalons
	set var_listeSalonsConnectes {}
	foreach var_idSalon [array names var_listeSalons -regexp {^[^,]*$}]  {
		if { [proc_getConnexionSalon $var_idSalon] == 1 } { 
			lappend var_listeSalonsConnectes $var_idSalon
		}
	}	
	return $var_listeSalonsConnectes
}
